import {connect} from 'react-redux'
let mapState = function(myComponet,stateData){
    //myComponet  代表需要绑定的组件，stateData数组类型，代表需要绑定的状态数据的名称
    const mapStateToProps = (state)=>{
        let states = {};
        for(let index in stateData){
            states[stateData[index]] = state[stateData[index]]
        }
        return states;
    }

    //将数据绑定给指定的组件，并且将绑定的结果返回给外界
    return connect(mapStateToProps)(myComponet)
}
//为了组件添加修改store中的state操作
let mapDispatch = function(myComponet,actions){
    let mapDispatchToProps = function(dispatch){
        //当前对象将要保存映射方法，最终传递给当前组件的props属性
        let dispatchs = {};
        // actions = [{type:"changeTitle",params:true},{type:"changeBack",params:true}]
        //循环注册方法（方法给当前组件）
        for(let index in actions){
            let action = actions[index];
            //判断是否有参数需要传递到store内部
            if(action.params){
                // 向对象中添加函数
                dispatchs[action.type] = (params)=>{
                    // 当被触发时，向store中传递action
                    return dispatch({
                        ...action,
                        params
                    })
                }
            }else{
                dispatchs[action.type] = ()=>{
                    // 当被触发时，向store中传递action
                    dispatch({type:action.type})
                }
            }
        }
        return dispatchs;
    }
    // mapDispatchToProps 会在内部生成一个对象，对象是一个键值对，键是方法名，键对应的值是函数体。此对象会被connect传递到myComponet变量代表的组件的props中，所以我们可以在myComponet的组件中使用：this.props.键名
    //connect函数把mapDispatchToProps执行的结果（dispatchs），传递给 myComponet变量的组件的props对象中。一句话：把dispatch对象和props对象合并。
    return connect(null,mapDispatchToProps)(myComponet)
}
export {mapState,mapDispatch}